package com.hmdp.service.impl;

import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.ShopType;
import com.hmdp.mapper.ShopTypeMapper;
import com.hmdp.service.IShopTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 查询所有店铺类型
     *
     * @return
     */
    @Override
    public List<ShopType> queryList() {
        //使用Hash类型
        /* // 1.从redis中查询店铺类型（使用Hash类型）
        Map<Object, Object> shopTypeMap = stringRedisTemplate.opsForHash().entries("list:shop:type");
        // 2.判断店铺类型是否存在
        if (!shopTypeMap.isEmpty()) {
            // 3.如果有就返回店铺类型
            List<ShopType> typeList = new ArrayList<>();
            // 遍历Hash中的所有值，转换为ShopType对象
            for (Object value : shopTypeMap.values()) {
                ShopType shopType = JSONUtil.toBean(value.toString(), ShopType.class);
                typeList.add(shopType);
            }
            // 按sort字段排序（因为Hash无序，需要手动排序）
            typeList.sort(Comparator.comparing(ShopType::getSort));
            return typeList;
        }
        // 4.如果没有，查询数据库
        List<ShopType> typeList = query().orderByAsc("sort").list();
        // 5.如果在数据库中查询不到就返回错误
        if(typeList.isEmpty()){
            return (List<ShopType>) Result.fail("店铺类型不存在");
        }
        // 6.存在就保存到redis（使用Hash类型）
        Map<String, String> shopTypeHash = new HashMap<>();
        for (ShopType shopType : typeList) {
            // 使用店铺类型ID作为Hash的field，JSON字符串作为value
            shopTypeHash.put(String.valueOf(shopType.getId()), JSONUtil.toJsonStr(shopType));
        }
        stringRedisTemplate.opsForHash().putAll("list:shop:type", shopTypeHash);
        // 7.返回
        return typeList;*/

        //使用Redis String类型
        // 1.从redis中查询店铺类型
        String listShopType = stringRedisTemplate.opsForValue().get("list:shop:type");
        // 2.判断店铺类型是否存在
        if (listShopType != null && !listShopType.isEmpty()) {
            // 3.如果有就返回店铺类型
            List<ShopType> typeList = JSONUtil.toList(listShopType, ShopType.class);
            return  typeList;
        }
        // 4.如果没有，查询数据库
        List<ShopType> typeList = query().orderByAsc("sort").list();
        // 5.如果在数据库中查询不到就返回401
        if(typeList.isEmpty()){
            return (List<ShopType>) Result.fail("店铺类型不存在");
        }
        // 5.存在就保存到redis
        stringRedisTemplate.opsForValue().set("listShopType", JSONUtil.toJsonStr(typeList));
        // 6.返回
        return typeList;

    }
}
